/**
 * @param {Function} Animal 父类
 * @param {Function} Cat 子类
 * @description
	组合继承是将原型链继承和构造函数继承组合起来使用，既继承了父类的属性和方法，又不会互相影响
	
	优点：
	可以继承父类原型中的属性和方法。
	可以向父类构造函数传递参数，实现了子类实例属性的独立性。
	
	缺点：
	会调用两次父类构造函数，导致父类实例属性被重复定义。
	子类原型上会有一份相同的父类实例属性，浪费内存。
 */
function Animal(type) {
	this.type = type;
}
Animal.prototype.say = function() {
	console.log('I am an animal.');
}

function Cat(type) {
	Animal.call(this, type); //构造函数继承
}
Cat.prototype = new Animal(); //原型继承
Cat.prototype.constructor = Cat; //补一个constructor

const dog = new Cat('Cat');
console.log(dog.type); // Cat
dog.say(); // I am an animal.